package com.pay.job.handler;

import com.google.common.collect.Lists;
import com.pay.job.entity.AggregateAmountDO;
import com.pay.job.service.PaymentJobDailyReportService;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author 周益和
 * @ClassName PaymentDailyReportHandler
 * @qq 1552951165
 */
@Component
@Slf4j
public class PaymentDailyReportHandler {
    @Autowired
    private PaymentJobDailyReportService paymentJobDailyReportService;
    
    // 分片大小,即每个线程携带的数据数量
    private static final Integer PARTITION_SIZE = 1;
    
    @XxlJob("PaymentDailyReportHandler")
    public void shardingJobHandler(){
        // 获取到定时任务 对应在注册中心 index位置
        // 分片参数
        /*获取当前任务分片的索引。在分布式任务中，一个任务可能会被分成多个子任务（分片），
         *每个子任务处理一部分数据。shardIndex 就是用来标识当前子任务的索引。*/
        int shardIndex = XxlJobHelper.getShardIndex();
        /*获取总的分片数量。这个值可以帮助你了解你的任务被分成了多少个子任务。*/
        int shardTotal = XxlJobHelper.getShardTotal();
        log.info("shardIndex:{},shardTotal:{}",shardIndex,shardTotal);
        
        // 1.查询昨日的商户成交金额（分页)
        List<AggregateAmountDO> aggregateAmountList =
                paymentJobDailyReportService.merchantTransactionAmount(shardIndex);
        
        // 每个定时只会查询 2条，对2条数据分割 成两个不同的线程处理
        List<List<AggregateAmountDO>> aggregateAmountListPartitions =
                Lists.partition(aggregateAmountList, PARTITION_SIZE);
        
        // 2.多线程拆分数据 异步处理
        for (List<AggregateAmountDO> aggregateAmountListPartition : aggregateAmountListPartitions) {
            // 每个批次都是独立线程处理
            paymentJobDailyReportService.asynSendMerchantTransactionAmount(aggregateAmountListPartition);
        }
    }
}
